#include <stdio.h>
#include <stdlib.h>
#define DIM_CODA 10 // dimensione della coda

struct Tdati{
int msgNumber;
int sensorID;
char *sensorValue;
char *destinationIP;
};

typedef struct Tdati dati_t;

struct Tcoda{
int num;
int testa,coda;
dati_t *dato;
};

typedef struct Tcoda coda_t;


int queue_initialization(coda_t *c);
int insert_in_head(coda_t *c,dati_t elemento);
int remove_from_tail(coda_t *c,dati_t *elemento);


// -----------------------------------------------------------------------------------------------------------------------------------------------------

int queue_initialization(coda_t *c){
	c->num=c->testa=c->coda=0;
	c->dato=(dati_t*)malloc(sizeof(dati_t)*DIM_CODA);

	if(c->dato==NULL)
		return 1;

	return 0;
}

// -----------------------------------------------------------------------------------------------------------------------------------------------------


int insert_in_head(coda_t *c,dati_t elemento){
	// SE LA CODA NON È PIENA...
	if(c->num < DIM_CODA)
	{

		c->dato[c->testa]=elemento;

		c->testa = (c->testa + 1) % DIM_CODA;
	
		c->num++;
		
		//printf("Elemento inserito in coda correttamente! Numero di elementi attualmente presenti in coda: %d\n", c->num);
	
		return 0;
	
	}

	return 1;
}


// -----------------------------------------------------------------------------------------------------------------------------------------------------


int remove_from_tail(coda_t *c,dati_t *elemento){
	// SE LA CODA NON È VUOTA...
	if(c->num > 0)
	{
		*elemento=c->dato[c->coda];
	
		c->coda=(c->coda + 1) % DIM_CODA;
	
		c->num--;
		
		//printf("Elemento rimosso dalla coda correttamente! Numero di elementi attualmente presenti in coda: %d\n", c->num);
	
		// usciamo con successo
		return 0;
	
	}

	// se non abbiamo eseguito quelle operazioni, usciamo con codice di fallimento (che sarebbe l'1)
	return 1;

}
